package ljl.bilibili.notice.mapper;
import ljl.bilibili.notice.vo.response.get_notice.CommentNoticeResponse;
import ljl.bilibili.notice.vo.response.get_notice.DynamicVideoResponse;
import ljl.bilibili.notice.vo.response.get_notice.LikeNoticeResponse;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface NoticeServiceMapper {

    /**
     * 获取用户收到的视频点赞通知。
     * 查询用户发布的视频被其他用户点赞的通知记录，返回点赞用户的昵称、ID、头像、视频封面、视频ID、通知创建时间和状态。
     * 结果按通知创建时间降序排列。
     *
     * @param userId 用户ID，用于查询该用户发布的视频被点赞的通知。
     * @return 包含点赞通知信息的列表，类型为 {@link LikeNoticeResponse}。
     */
    @Select("select u.nickname as nickName, u.id as userId, u.cover as userCover, v.cover as videoCover, v.id as videoId, ln.create_time as createTime, ln.status from video v inner join like_notice ln on ln.video_id = v.id inner join user u on u.id = ln.sender_id where v.user_id = #{userId} and ln.comment_id is null order by ln.create_time desc")
    List<LikeNoticeResponse> getVideoLikeNotice(Integer userId);

    /**
     * 获取用户收到的评论点赞通知。
     * 查询用户发布的评论被其他用户点赞的通知记录，返回点赞用户的昵称、ID、头像、评论所属视频ID、点赞状态、评论内容。
     *
     * @param userId 用户ID，用于查询该用户发布的评论被点赞的通知。
     * @return 包含评论点赞通知信息的列表，类型为 {@link LikeNoticeResponse}。
     */
    @Select("select u.nickname AS nickName, u.id AS userId, u.cover AS userCover, c1.video_id AS videoId, ln.comment_id AS commentId, ln.status AS status, c1.content FROM comment c1 INNER JOIN like_notice ln ON (ln.comment_id = c1.id) INNER JOIN comment c2 ON (c2.id = ln.sender_id) INNER JOIN user u ON (u.id = c2.user_id) WHERE u.id = #{userId}")
    List<LikeNoticeResponse> getCommentLikeNotice(Integer userId);

    /**
     * 获取用户收到的视频评论通知。
     * 查询用户发布的视频被其他用户评论的通知记录，返回评论用户的昵称、ID、头像、视频封面、视频ID、评论内容、评论ID、通知状态和创建时间。
     * 只查询顶级评论（即没有父评论），结果按通知创建时间降序排列。
     *
     * @param userId 用户ID，用于查询该用户发布的视频被评论的通知。
     * @return 包含视频评论通知信息的列表，类型为 {@link CommentNoticeResponse}。
     */
    @Select("SELECT cn.status, v.cover AS videoCover, v.id AS videoId, u.nickname AS nickName, u.cover AS userCover, c.content AS replyContent, c.id AS replyId, c.create_time AS createTime FROM video v INNER JOIN comment c ON (c.video_id = v.id) INNER JOIN user u ON (u.id = c.user_id) INNER JOIN comment_notice cn ON (cn.sender_id = c.id) WHERE (v.user_id =#{userId} AND c.parent_id IS NULL) ORDER BY cn.create_time DESC")
    List<CommentNoticeResponse> getCommentToVideoNotice(Integer userId);

    /**
     * 获取用户收到的评论回复通知。
     * 查询用户发布的评论被其他用户回复的通知记录，返回回复用户的昵称、ID、头像、原评论内容、回复内容、回复ID、通知状态。
     *
     * @param userId 用户ID，用于查询该用户发布的评论被回复的通知。
     * @return 包含评论回复通知信息的列表，类型为 {@link CommentNoticeResponse}。
     */
    @Select("SELECT t1.status, t3.cover AS userCover, t3.id AS userId, t.content AS replyToContent, comment.content AS replyContent, t1.sender_id AS replyId FROM comment t INNER JOIN comment_notice t1 ON (t1.receiver_id = t.id) INNER JOIN comment comment ON (comment.id = t1.sender_id) INNER JOIN user t3 ON (t3.id = comment.user_id) WHERE (t.user_id = #{userId})")
    List<CommentNoticeResponse> getCommentToCommentNotice(Integer userId);

    /**
     * 获取用户收到的动态视频通知。
     * 查询与用户相关的动态视频记录，返回动态ID、状态、视频ID、视频封面、视频名称、创建时间、作者头像、作者昵称、作者ID。
     * 结果按动态创建时间降序排列。
     *
     * @param userId 用户ID，用于查询与该用户相关的动态视频通知。
     * @return 包含动态视频通知信息的列表，类型为 {@link DynamicVideoResponse}。
     */
    @Select("SELECT t.id, t.status, d.video_id, d.video_cover, d.video_name, d.create_time, u.cover AS authorCover, u.nickname AS authorName, u.id AS authorId FROM dynamic_to_user t INNER JOIN dynamic d ON (d.id = t.dynamic_id) INNER JOIN user u ON (u.id = d.author_id) WHERE (t.user_id = #{userId}) ORDER BY d.create_time DESC")
    List<DynamicVideoResponse> getDynamicVideoNotice(Integer userId);
}
